package com.imaker.utils;

import java.io.File;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.imaker.action.BaseAction;

import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * 用于处理Freemarker模板的解析工作
 * @author mayh
 *
 */
public class TemplateHelper extends BaseAction{
	
	private static Configuration  cfg = new Configuration(); ; 
	
	/**
	 * 根据传入的List和模板进行解析
	 * 组织生成模块模板的相应数据
	 * @param objList
	 * @param templateId
	 * @return
	 */
	public static String templateAnaly(List objList,String templateId,Map<String,String> modulesInfo){
		String analyString = "";
		if(Validate.notNull(templateId)){
//		获得模板存放的路径
		String path = getConfigPath()+"/template";
        try {
			cfg.setDirectoryForTemplateLoading(new File(path));
			Map<String,Object> root = new HashMap<String,Object>();
			root.put("objList", objList);
			root.put("modulesInfo", modulesInfo);
			Template t = cfg.getTemplate(templateId);
			StringWriter sw = new StringWriter();
			t.process(root, sw);
			analyString = sw.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		}
		return analyString;
	}
	
	/**
	 * 对代码自动生成的模板进行分析，并生成相关数据
	 * @param objList
	 * @param templateName
	 * @param map
	 * @return
	 */
	public static String templateCodeAnaly(List objList,String templateName,Map<String,Object> map){
		String analyString = "";
		if(Validate.notNull(templateName)){
//		获得模板存放的路径
		String path = getConfigPath()+"/template/entityTemplate";
        try {
			cfg.setDirectoryForTemplateLoading(new File(path));
			Map<String,Object> root = new HashMap<String,Object>();
			root.put("objList", objList);
			root.put("entity", map);
			Template t = cfg.getTemplate(templateName);
			StringWriter sw = new StringWriter();
			t.process(root, sw);
			analyString = sw.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		}
		return analyString;
	}
	
	/**
	 * 将用户输入的模块class名称进行转换，转换为页面css所识别的表示,页面采用grid_24格式
	 * @param classString{# # # # #}
	 * @return
	 */
	public static String modulesStyleAnaly(String classString){
		StringBuffer sb = new StringBuffer();
//		如果classString 不为空
		if(Validate.notNull(classString)){
//			使用空格进行分割
			String[] array = StringHelper.stringToArray(classString,"\\s+");
//			如果只有一个元素,说明只有模块的宽度
			if(array.length==1){
				sb.append(" grid_"+gridNum(array[0]));
			}else if(array.length==2){
//			如果有2个元素，说明用户指定了模块的宽度，和距离左边模块的距离
				sb.append(" grid_"+gridNum(array[0]));
				sb.append(" prefix_"+gridNum(array[1]));
			}else if(array.length==3){
//			如果有3个元素，说明用户指定了模块的宽度，距离左边的距离，和距离右边的距离
				sb.append(" grid_"+gridNum(array[0]));
				sb.append(" prefix_"+gridNum(array[1]));
				sb.append(" suffix_"+gridNum(array[2]));
			}else if(array.length==4){
//			如果有4个元素，说明用户指定了模块的宽度，距离左边的距离，和距离右边的距离,并且不显示左边的margin
				sb.append(" grid_"+gridNum(array[0]));
				sb.append(" prefix_"+gridNum(array[1]));
				sb.append(" suffix_"+gridNum(array[2]));
				if("1".equals(array[3]))
				sb.append(" alpha");
			}else if(array.length==5){
//			如果有4个元素，说明用户指定了模块的宽度，距离左边的距离，和距离右边的距离,并且不显示两边的margin		
				sb.append(" grid_"+gridNum(array[0]));
				sb.append(" prefix_"+gridNum(array[1]));
				sb.append(" suffix_"+gridNum(array[2]));
				if("1".equals(array[3]))
				sb.append(" alpha");
				if("1".equals(array[4]))
				sb.append(" omega");
			}else {
//			如果参数少于一个或者大于5个，说明不正确	
				sb.append(" grid_24");
			}
		}else {
//		如果为空则表示使用默认：默认是占满一行
			sb.append(" grid_24");
		}
		return sb.toString().trim();
	}
	
	/**
	 * 对用户输入的参数进行检查纠正
	 * @param numString
	 * @return
	 */
	private static int gridNum(String numString){
		int num = Integer.parseInt(numString.trim());
		num = num>24?24:num;
		num = num<0?0:num;
		return num;
	}
	
	
	/**
	 * 给相应的元素添加一个class属性，用来标识不同的元素
	 * @param classIndex
	 * @return
	 */
	public static String modulesClassAnaly(String classIndex,int index){
		if(!Validate.notNull(classIndex))
			return "";
		String className = "";
		if("0".equals(classIndex)){
			className = "center_l_"+index;
		}else if("1".equals(classIndex)){
			className = "center_c_"+index;
		}else if("2".equals(classIndex)){
			className = "center_r_"+index;
		}else if("3".equals(classIndex)){
			className = "top_"+index;
		}else if("4".equals(classIndex)){
			className = "bottom_"+index;
		}
		return className;
	}
	
	
}
